/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTABILIDAD_MODELO;

import Conexion.Conexion;
import java.sql.ResultSet;
import java.util.StringTokenizer;

/**
 *
 * @author equipo_4
 */
public class CON_AJUSTE_REDONDEO 
{
  
    
    public CON_AJUSTE_REDONDEO() {
        
    }  
    
     public void Generar(Conexion con, int mes, int ano)
    {
        try
        {
            String consulta =   "SELECT DISTINCT (CON_CUENTA_CONTABLE.CODIGO) as CODIGO_CUENTA,\n" +
                                "CON_CUENTA_CONTABLE.DESCRIPCION,\n" +
                                "CON_CENTRO_COSTO.CODIGO as CODIGO_CENTRO,\n" +
                                "CON_CENTRO_COSTO.DESCRIPCION\n" +
                                "FROM BROKER.CON_COMPROBANTE,\n" +
                                "BROKER.CON_CUENTA_COMPROBANTE,\n" +
                                "BROKER.CON_CUENTA_CONTABLE,\n" +
                                "BROKER.CON_CENTRO_COSTO,\n" +
                                "BROKER.CON_MONEDA\n" +
                                "WHERE (CON_CUENTA_COMPROBANTE.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                                "AND (CON_CUENTA_COMPROBANTE.ID_CUENTA = CON_CUENTA_CONTABLE.ID)\n" +
                                "AND (CON_CUENTA_CONTABLE.ID_MONEDA = CON_MONEDA.ID)\n" +
                                "AND (CON_CUENTA_COMPROBANTE.ID_CENTRO_COSTO = CON_CENTRO_COSTO.ID(+))\n" +
                                "AND (CON_MONEDA.MONEDA_BASE <> 0)\n" +
                                "AND (CON_COMPROBANTE.ESTADO_ANULADO = 0)\n" +
                                "AND (CON_COMPROBANTE.ESTADO_RECURRENTE = 0)" +
                                "AND (CON_COMPROBANTE.CODIGO like('%-"+mes+"-"+ano+"'))";
            ResultSet rs = con.EjecutarConsulta(consulta);
            
            CON_COMPROBANTE comp = new CON_COMPROBANTE();
            comp.setCon(con);
            comp=comp.BuscarXRECURRENTE(4);
           
            String celiminar ="delete from BROKER.CON_CUENTA_COMPROBANTE where ID_COMPROBANTE = "+comp.getID();
            con.EjecutarSentencia(celiminar);
           
            while(rs.next())
            {
                String c = rs.getString("CODIGO_CENTRO");
                if(rs.getString("CODIGO_CENTRO")==null)
                {
                    String consulta2 = "select * from BROKER.CON_AJUSTE_REDONDEO where CODIGO_CUENTA like('"+rs.getString("CODIGO_CUENTA")+"')";
                    ResultSet rs2 = con.EjecutarConsulta(consulta2);
                    Double debe = 0.0;
                    Double haber = 0.0;
                    Double debe_tc = 0.0;
                    Double haber_tc = 0.0;
                    Double tc=0.0;
                    
                    while(rs2.next())
                    {
                        Double da=rs2.getDouble("DEBE");
                        Double ha=rs2.getDouble("HABER");
                        
                        tc =rs2.getDouble("TIPO_DE_CAMBIO");
                        if(tc==0)
                            tc =rs2.getDouble("TIPO_DE_CAMBIO_VENTA");
                        
                        debe += da;
                        haber += ha;
                        
                        Double adebe_tc = truncarDecimal(da*tc);
                        Double ahaber_tc = truncarDecimal(ha*tc);
                        
                        debe_tc+=adebe_tc;
                        haber_tc+=ahaber_tc;
                        
                    }
                    
                    Double y = truncarDecimal(((haber-debe)*tc));
                    Double x = truncarDecimal((haber_tc-debe_tc));
                    
                    Double result = truncarDecimal((x-y));
                    
                    if(result==0)
                    {
                    
                    }
                    else
                    {
                        if(result>=0.01)
                        {
                            String consulta3 = "select * from BROKER.CON_COMPROBANTE_REDONDEO";
                            ResultSet rs3 = con.EjecutarConsulta(consulta3);
                            rs3.next();

                            CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
                            cuenta.setCon(con);
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            
                            
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CUENTA_COMPROBANTE cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, result, 0.0, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                            cuenta = cuenta.BuscarXid(rs3.getDouble("CUENTA_DEBE"));
                            cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, truncarDecimal(result*tc), rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                        }   
                        if(result<=-0.01)
                        {
                            String consulta3 = "select * from BROKER.CON_COMPROBANTE_REDONDEO";
                            ResultSet rs3 = con.EjecutarConsulta(consulta3);
                            rs3.next();

                            CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
                            cuenta.setCon(con);
                         
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CUENTA_COMPROBANTE cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, result*-1, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                            cuenta = cuenta.BuscarXid(rs3.getDouble("CUENTA_HABER"));
                            cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, truncarDecimal(((result*-1)*tc)), 0.0, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                        }
                    }
                }
                else
                {
                    String consulta2 = "select * from BROKER.CON_AJUSTE_REDONDEO where CODIGO_CENTRO_COSTO like('"+rs.getString("CODIGO_CENTRO")+"')";
                    ResultSet rs2 = con.EjecutarConsulta(consulta2);                    
                    Double debe = 0.0;
                    Double haber = 0.0;
                    Double debe_tc = 0.0;
                    Double haber_tc = 0.0;
                    Double tc=0.0;
                    
                    while(rs2.next())
                    {
                        Double da=rs2.getDouble("DEBE");
                        Double ha=rs2.getDouble("HABER");
                        
                        tc =rs2.getDouble("TIPO_DE_CAMBIO");
                        if(tc==0)
                            tc =rs2.getDouble("TIPO_DE_CAMBIO_VENTA");
                        debe += da;
                        haber += ha;
                        debe_tc += truncarDecimal(da*tc);
                        haber_tc += truncarDecimal(ha*tc);
                    }
                    
                    Double y = (haber-debe)*tc;
                    Double x = haber_tc-debe_tc;
                    
                    Double result = x-y;
                    
                    if(result==0)
                    {
                    
                    }
                    else
                    {
                        if(result>=0.001)
                        {
                            String consulta3 = "select * from BROKER.CON_COMPROBANTE_REDONDEO";
                            ResultSet rs3 = con.EjecutarConsulta(consulta3);
                            rs3.next();

                            CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
                            cuenta.setCon(con);
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CENTRO_COSTO centro = new CON_CENTRO_COSTO(con);
                            centro.setCon(con);
                            centro = centro.BuscarXCodigo(rs.getString("CODIGO_CENTRO"));
                        

                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CUENTA_COMPROBANTE cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, result, 0.0, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), centro.getID(), cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                            cuenta = cuenta.BuscarXid(rs3.getDouble("CUENTA_DEBE"));
                            cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, truncarDecimal(result*tc), rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                        }   
                        if(result<=-0.001)
                        {
                            String consulta3 = "select * from BROKER.CON_COMPROBANTE_REDONDEO";
                            ResultSet rs3 = con.EjecutarConsulta(consulta3);
                            rs3.next();

                            CON_CUENTA_CONTABLE cuenta = new CON_CUENTA_CONTABLE(con);
                            cuenta.setCon(con);
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CENTRO_COSTO centro = new CON_CENTRO_COSTO(con);
                            centro.setCon(con);
                            centro = centro.BuscarXCodigo(rs.getString("CODIGO_CENTRO"));
                         
                            cuenta = cuenta.BuscarXCodigo(rs.getString("CODIGO_CUENTA"));
                            CON_CUENTA_COMPROBANTE cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, 0.0, result*-1, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), centro.getID(), cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                            cuenta = cuenta.BuscarXid(rs3.getDouble("CUENTA_HABER"));
                            cuentac = new CON_CUENTA_COMPROBANTE(0.0, 0.0, 0.0, truncarDecimal((result*-1)*tc), 0.0, rs3.getString("GLOSA"), cuenta.getID(), comp.getID(), 0.0, cuenta.getDESCRIPCION(), 0.0);
                            cuentac.setCon(con);
                            cuentac.Insertar();
                        }
                    }
                }                
            }  
        }
        catch(Exception e)
        {
            con.rollback();
        }
    }       
     
     public static Double truncarDecimal(Double dec){
         
         Double aux2=(Math.rint(dec*1000000)/1000000); 
         
         String decimal = aux2.toString();
         
         if(decimal.length()==0)return 0.0;
                String resultado=decimal;
        
        StringTokenizer token = new StringTokenizer(decimal,".");
        
        if(token.countTokens()==2){
            String numero0=token.nextToken();
            String numero1=token.nextToken();
            if(numero1.length()>17)
            numero1 = numero1.substring(0, 16);
            resultado=numero0;
            if(Double.parseDouble(numero1)>2)
            {
                int aux = 0;
                String valor ="";
                if(numero1.length()-1==0)
                    valor=numero1+"";
                for(int i=numero1.length()-1;i>=1;i--)
                {
                    Double v = Double.parseDouble(numero1.charAt(i)+"")+aux;
                    if(i==1)
                    {
                        valor = (Integer.parseInt(numero1.substring(0,2))+aux)+"";
                        if(valor.length()==3)
                        {
                            return Double.parseDouble(numero0)+1;
                        }
                        if(valor.length()==1)
                        {
                            valor="0"+valor;
                        }
                    }
                    aux=v>=5?1:0;
                } 
                
                resultado+="."+valor;
            }else{
                resultado=decimal;
            }
        }
        return Double.parseDouble(resultado);
    }     
     
}
